package com.hqyj.ssm.config;/*
 * ClassName  MyRealm
 * @Author： AJA
 * @Description ：TODO
 *
 * @Date  2022/1/6 10:04
 * @Version 1.0
 **/

import com.hqyj.ssm.mapper.UserMapper;
import com.hqyj.ssm.pojo.Role;
import com.hqyj.ssm.pojo.User;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

//
public class MyRealm extends AuthorizingRealm {

    @Autowired
    private UserMapper userMapper;

    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        //把登录的用户信息获取到
        User user = (User)SecurityUtils.getSubject().getSession().getAttribute("loginUser");
        //取出登录用户信息中的角色信息
        List<Role> roleList = user.getRoles();
        //创建set集合，用来存角色信息
        Set<String> roleSet = new HashSet<>();
        //判断角色信息是否为空
        if(roleList != null){
            // 遍历roleList，获取到每一个角色名称
            for (Role role:roleList) {
                // 可以把角色信息存入 set 集合
                roleSet.add(role.getRoleName());
            }
        }
        // 创建SimpleAuthorizationInfo对象
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        // 调用SimpleAuthorizationInfo对象中的addRoles方法，把当前用户的角色信息存入进入
        info.addRoles(roleSet);
        return info;
    }

    //认证：判断当前用户是否登录
    //由开发者来编写，实现从数据库中查询待认证的用户的用户信息。以提供給shiro框架进行密码匹配工作
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        //获取当前登录的用户名
        String username = (String) token.getPrincipal();
        //把用户传入数据库查询用户信息
        User user = userMapper.selectUserByUsername(username);
        //判断查询出来的用户是否为null
        if(user == null){
            //如果查询出来的用户为null，表示数据路中没有该用户
            throw new UnknownAccountException();
        }
        //如果查询出来的用户存在，就把当前用户信息存入session中
        SecurityUtils.getSubject().getSession().setAttribute("loginUser",user);
        //获取盐
        ByteSource salt = ByteSource.Util.bytes(user.getUsername());
        //返回：参数：1.用户名 2.密码 3.盐 4.getName(),realm名称
        return new SimpleAuthenticationInfo(username,user.getPassword(),salt,getName());
    }
}
